﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Data.SQLite;
using System.IO;
using System.Text;

namespace zhihu {
    static class Program {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main() {
            // 初始化sqlite数据库
            string dbFilePath = Application.StartupPath + @"\zhihu.db";
            SQLiteConnectionStringBuilder connstr = new SQLiteConnectionStringBuilder();
            connstr.DataSource = dbFilePath;
            GlobalInfo.ConnectionString = connstr.ToString();
            if (!File.Exists(dbFilePath)) {
                SQLiteConnection.CreateFile(Application.StartupPath + @"\zhihu.db");
                SQLiteHelper.ExecuteNonQuery(connstr.ToString(), Properties.Resources.sqlcommand, null);
            }
            
            // 初始化采集设置
            GlobalInfo.AnswerTimes = 5;
            GlobalInfo.MaxQuestionCount = 500;
            GlobalInfo.TopicID = "19776749"; // 根话题ID

            // 调试用
            // GlobalInfo.LoginCookies = Properties.Resources.debugCookies;

            Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
            Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
            AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new FormMain());
        }

        static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) {
            // throw new NotImplementedException();
            string str = GetExceptionMsg(e.ExceptionObject as Exception, e.ToString());
            MessageBox.Show(str, @"系统错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
        static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e) {
            // throw new NotImplementedException();
            string str = GetExceptionMsg(e.Exception, e.ToString());
            MessageBox.Show(str, @"系统错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
        /// <summary>
        /// 生成自定义异常消息
        /// </summary>
        /// <param name="ex">异常对象</param>
        /// <param name="backStr">备用异常消息：当ex为null时有效</param>
        /// <returns>异常字符串文本</returns>
        static string GetExceptionMsg(Exception ex, string backStr) {
            StringBuilder sb = new StringBuilder();
            sb.AppendLine("****************************异常文本****************************");
            sb.AppendLine("【出现时间】：" + DateTime.Now.ToString());
            if (ex != null) {
                sb.AppendLine("【异常类型】：" + ex.GetType().Name);
                sb.AppendLine("【异常信息】：" + ex.Message);
                sb.AppendLine("【堆栈调用】：");
                sb.AppendLine(ex.StackTrace);
            }
            else {
                sb.AppendLine("【未处理异常】：" + backStr);
            }
            sb.AppendLine("***************************************************************");
            return sb.ToString();
        }
    }
}
